﻿#pragma warning disable 1591

using System.Collections.Generic;

namespace DM4Script
{
    /// <summary>
    /// Token
    /// </summary>
    // ReSharper disable InconsistentNaming
    public enum Token
    {
        Eof = '\x1',
        Def = '\x2',
        Extern = '\x3',          // команды (ключевые слова)
        Identifier = '\x4',
        Number = '\x5',          // операнды (первичные выражения: идентификаторы, числа)

        Declare = '\x6',         // decrate секция
        Task = '\x7',            // task определение
        SubTask = '\x8',         // subtask определение
        Run = '\x9',             // run определение
        Module = '\xA',
        SessionCount = '\xB',
        Priority = '\xC',
        IgnoreErrors = '\xD',
        RunTask = '\xE',
        Property = '\xF',

        If = '\x10',
        Then = '\x11',
        Else = '\x12',
        ElseIf = '\x13',

        Oper = '\x14',           //оператор
        Bool = '\x15'
    };

    public partial class ScriptParse
    {
        /// GetTokPrecedence - Возвращает приоритет текущего бинарного оператора.
        private int GetTokPrecedence()
        {
            if (_curTok == (char)Token.Oper && Setup.binopPrecedence.ContainsKey(_identifierStr.ToUpperInvariant()))
                return Setup.binopPrecedence[_identifierStr.ToUpperInvariant()];
            return -1;
        }
    }

    public static class Setup
    {
        /// BinopPrecedence - Содержит приоритеты для бинарных операторов
        static public readonly Dictionary<string, int> binopPrecedence = new Dictionary<string, int>
            {{"OR", 5},
            {"AND", 6},
            {"<", 10},
            {">", 10},
            {"==", 10},
            {"!=", 10},
            {"<=", 10},
            {">=", 10},
            {"+", 20},
            {"-", 20},
            {"*", 40},
            {"/", 40 /* highest*/}
            };
    }
}
